Authors : Tracy Rabilloud, Delphine Potier, Saran Pankew, Mathis Nozais, Marie Loosveld§, Dominique Payet-Bornet§

Raw data and intermediate data matrices are available in SRA/GEO (SRP269742 / GSE153697)

Introduction

The dataset is derived from the study titled “Single-cell profiling identifies pre-existing CD19-negative subclones in a B-ALL patient with CD19-negative relapse after CAR-T therapy,” spearheaded by Tracy Rabilloud and Delphine Potier. Focusing on B-ALL cells, the data offers insights into the emergence of CD19-negative subclones post-CAR-T therapy. These samples, taken from a B-ALL patient, present a unique window into the cellular dynamics in response to treatment. The core aim of the analysis is to uncover the molecular adaptations and potential resistance pathways these cells adopt following therapy. The primary objective of this analysis is to ascertain whether there are discernible differences in the expression of leukemic stem cell markers in B-ALL cells before and after CAR-T therapy. By elucidating these variations, the analysis seeks to shed light on potential shifts in stemness or resistance phenotypes in response to treatment.

Environment Setup

This section sets up the necessary libraries and global parameters for the analysis.

# Load necessary packages
library(Seurat)
library(DT)
library(plotly)

# Set the working directory and output path
CWD <- "/home/juliangc/Desktop/BRN_sc_try/sc_analysis_try/B-ALL-CAR-T/1_Seurat_analysis/"
OUTPUT_PATH <- "/home/juliangc/Desktop/BRN_sc_try/sc_analysis_try/B-ALL-CAR-T/1_Seurat_analysis/output"

# Source additional scripts containing workflow functions
source(paste(CWD, "scripts/Workflow_functions.R", sep = "/"))

# Set seed for reproducibility
set.seed(1234)

# Set resolution for clustering
RESOLUTION <- 0.1

Data Paths

Define paths to the data files required for analysis.

# Load path for files
PATH_DATA <- "/home/juliangc/Desktop/BRN_sc_try/sc_analysis_try/B-ALL-CAR-T/1_Seurat_analysis/data/mRNA/"
SAMPLE <- "BALL-CART"
PROJECT_NAME <- paste("10X_", SAMPLE, sep = "")
PATH_HTO_DATA <- "/home/juliangc/Desktop/BRN_sc_try/sc_analysis_try/B-ALL-CAR-T/1_Seurat_analysis/data/HTO"

Data Preprocessing

Sample Loading

Load the 10X data and create a Seurat object

# Read 10X data
bm_data <- Read10X(data.dir = PATH_DATA)

# Create the Seurat object and applies filters
Not_processed_Seurat <- CreateSeuratObject(counts = bm_data, min.cells = 3, min.features = 200, project = "CART")

HTO Data Loading and Processing

Loading and Preprocessing the HTO Data

Here, we load the HTO data and preprocess it for further analysis. This includes reading the UMI matrix, the HTO count matrix, and renaming samples for clarity.

# Load in the UMI matrix
umi_sparse <- GetAssayData(object = Not_processed_Seurat, slot = "counts")

# Load in the HTO count matrix
raw.hto <- Read10X(PATH_HTO_DATA, gene.column = 1)
# remove the "unmapped column"
hto <- raw.hto[c(1:4), ]

# Renames samples with shorter identifiers
# Used HTO were the following
# CTTTGTCTTTGTGAG, HTO-B (T1-CD19neg)
# AAGTATCGTTTCGCA, HTO-A (T1-CD19pos)
# AAAGCATTCTTCACG, HTO-D (T2-CD19neg)
# CTTGCCGCATGTCAT, HTO-C (T2-CD19pos)

rownames(hto) <- c("T1-CD19neg", "T1-CD19pos", "T2-CD19neg", "T2-CD19pos")


colnames(hto) <- paste0(colnames(hto), "-1")

# Select cell barcodes detected by both RNA and HTO
joint_bcs <- intersect(colnames(umi_sparse), colnames(hto))

# Subset RNA and HTO counts by joint cell barcodes
hto <- as.matrix(hto[, joint_bcs])

Creating a Composite Seurat Object with mRNA and HTO Data

We’ll set up a Seurat object that contains both RNA and HTO data. This involves normalizing the RNA data and adding the HTO data as an independent assay.

### Setup seurat object and add in the hto data
# Setup Seurat object
hashtag <- CreateSeuratObject(counts = umi_sparse[, joint_bcs], assay = "RNA", project = "CART")

# Normalize RNA data with log normalization
hashtag <- NormalizeData(hashtag, display.progress = FALSE)
# Find and scale variable genes
hashtag <- FindVariableFeatures(hashtag, do.plot = F, selection.method = "vst", nfeatures = 2000, display.progress = FALSE)
hashtag <- ScaleData(hashtag, genes.use = hashtag@assays$RNA@var.features)

### Adding HTO data as an independent assay
# Add HTO data as a new assay independent from RNA
hashtag[["HTO"]] <- CreateAssayObject(counts = hto)
hashtag <- SetAssayData(hashtag, assay = "HTO", slot = "counts", new.data = hto)
# Normalize HTO data using centered log-ratio (CLR) transformation
hashtag <- NormalizeData(hashtag, assay = "HTO", normalization.method = "CLR", display.progress = FALSE)

HTO Demultiplexing

In this step, we demultiplex cells based on HTO enrichment. We primarily use the HTODemux() function from Seurat to assign single cells back to their sample origins. The MULTIseqDemux() function was also tested, but we ultimately decided to proceed with HTODemux.

hashtag <- HTODemux(hashtag, assay = "HTO", positive.quantile = 0.99, verbose = FALSE)
hashtag <- MULTIseqDemux(hashtag, assay = "HTO", autoThresh = TRUE, maxiter = 10, qrange = seq(from = 0.1, to = 0.9, by = 0.05), verbose = TRUE)

Demultiplexing Results

Global Cell Classification

Below, we present the global classification of cells, identifying them as singlets, doublets, or negative/ambiguous cells based on HTO enrichment.

# Global classification results
datatable(as.matrix(table(hashtag@meta.data$HTO_classification.global)), colnames = "Number of cells")

Detailed Cell Classification

This table provides a more detailed classification of cells based on their HTO enrichment:

# Detailed classification results
datatable(as.matrix(table(hashtag@meta.data$HTO_classification)), colnames = "Number of cells", options = list(pageLength = 11))

Cells filtering and Quality Control

High-quality single-cell RNA sequencing data is crucial for accurate downstream analysis. During the sample loading and preprocessing, we apply stringent criteria to filter out potentially low-quality cells and retain only those cells that provide meaningful biological insights.

After those filters, the remaining cell number is 7058.

# Get cell identities for each sample
HTO_T1neg <- row.names(subset(hashtag@meta.data, hash.ID == "T1-CD19neg"))
HTO_T1pos <- row.names(subset(hashtag@meta.data, hash.ID == "T1-CD19pos"))
HTO_T2neg <- row.names(subset(hashtag@meta.data, hash.ID == "T2-CD19neg"))
HTO_T2pos <- row.names(subset(hashtag@meta.data, hash.ID == "T2-CD19pos"))

# Get the list of cell by time point
HTO_T0 <- c(HTO_T1neg, HTO_T1pos)
HTO_T1 <- c(HTO_T2neg, HTO_T2pos)

# Get the list of cells to keep
HTO_identified <- c(HTO_T0, HTO_T1)

# Create a "clean" Seurat object without doublet and unassigned cells
clean.subset <- subset(x = hashtag, cells = HTO_identified)

II) Filter out doublet and negative cells after HTOdemux sample demultiplexing.

After selecting identified unique cells, 3882 cells remain.

# Data preprocessing
if (!file.exists(paste0(OUTPUT_PATH, "Seurat_clean-subset_", SAMPLE, ".Robj"))) {
  # 1- Mitochondrial QC
  Seurat <- QC_function_mito_threshold(Seurat = clean.subset, mito_threshold = 0.1, do_plot = FALSE) # QC_function_mito_threshold function is in Workflow_functions.R

  # 2- Find variable genes
  Seurat <- FindVariableFeatures(
    object = Seurat,
    assay = "RNA", selection.method = "vst", nfeatures = 2000,
    verbose = FALSE, do.plot = TRUE
  )

  # 3- Scale data
  Seurat <- ScaleData(Seurat,
    assay = "RNA",
    verbose = FALSE,
    do.center = TRUE
  ) # ,features = rownames(Seurat)) to get all genes scaled

  # 4- Compute PCA
  Seurat <- RunPCA(
    object = Seurat,
    assay = "RNA",
    verbose = FALSE,
    features = VariableFeatures(object = Seurat),
    seed.use = 1234,
    npcs = 50
  )

  # 5- Elbowplot of principle components ranked based on the percentage of variance explained by each one.
  ElbowPlot(Seurat, ndims = 50, reduction = "pca")
  # We  observe an ‘elbow’ around PC20, suggesting that the majority of true signal is captured in the first 20 PCs

  # 6- Print genes that are strongly correlated with the first PCs
  Seurat <- ProjectDim(
    object = Seurat,
    nfeatures.print = 20,
    dims.print = 1:10
  )

  # 7- Define clusters
  Seurat <- FindNeighbors(
    object = Seurat,
    dims = 1:20,
    verbose = FALSE,
    force.recalc = TRUE,
    reduction = "pca"
  )

  # Fine clustering
  Seurat <- FindClusters(
    object = Seurat,
    resolution = RESOLUTION,
    verbose = FALSE,
    random.seed = 1234
  )

  # Coarse grained clustering
  Seurat <- FindClusters(
    object = Seurat,
    resolution = 0.1,
    verbose = FALSE,
    random.seed = 1234
  )


  # 8- Calulate UMAP coordinates based on the 20 first PCs
  Seurat <- RunUMAP(object = Seurat, reduction = "pca", seed.use = 1234, dims = 1:20)
}
## PC_ 1 
## Positive:  TYROBP, S100A6, FCER1G, FCN1, SERPINA1, LYZ, CST3, S100A11, CD68, SAT1 
##     LGALS1, ITGB2, S100A9, LGALS3, S100A4, ANXA1, S100A8, NFKBIA, FTL, NEAT1 
## Negative:  STMN1, TUBB, TUBA1B, HMGB1, PTMA, NASP, HIST1H4C, PARP1, UHRF1, CD24 
##     NPM1, IGLL1, PRDX1, MCM7, DNTT, LDHB, RAN, NCL, RPLP0, PDLIM1 
## PC_ 2 
## Positive:  AIF1, FCER1G, SERPINA1, S100A11, FCN1, TYROBP, LST1, TSPO, CST3, ITGB2 
##     ANXA5, LYZ, LGALS3, UBE2C, TOP2A, BIRC5, CD68, S100A9, CDK1, MKI67 
## Negative:  PMAIP1, AC007952.4, AC245014.3, AC103591.3, CD69, TSC22D3, Z93241.1, WDR74, AKAP13, PCDH9 
##     AC091271.1, CLEC2B, C12orf57, ELOA, AC087239.1, CD34, CLTC, SLC2A3, ARHGEF7, PTCH2 
## PC_ 3 
## Positive:  PLK1, TOP2A, CDCA3, UBE2C, DLGAP5, AURKB, MKI67, NUSAP1, ASPM, HMMR 
##     CKAP2L, BIRC5, HJURP, KIFC1, CDCA2, PIMREG, TPX2, CDCA8, CDKN3, CCNB2 
## Negative:  IFITM2, ENO1, EXOSC5, PRDX1, TCL1A, HSPD1, MRPL20, MSH6, TCL1B, CD164 
##     DCTPP1, EIF4EBP1, GNL3, PPA1, PAICS, ATP5MC1, HSPE1, DKC1, UNG, PRMT1 
## PC_ 4 
## Positive:  AC245014.3, VIM, WDR74, Z93241.1, AC007952.4, ZFP36, AC091271.1, CD44, ANXA2, PTCH2 
##     AC103591.3, SLC2A3, TSC22D3, RHOB, PMAIP1, AKAP13, AC087239.1, KLF6, S100A10, TMEM107 
## Negative:  VPREB1, CD79B, LINC01013, ARPP21, VPREB3, RPS4Y2, RAG2, IGHV5-78, HMHB1, RPL7A 
##     SCHIP1, P4HA2, IGLL1, FAM30A, DUSP26, SUSD3, CMTM8, RAG1, DNTT, CD27 
## PC_ 5 
## Positive:  PLK1, CCNB1, CDC20, KIF20A, AURKA, HMMR, TROAP, PSRC1, CENPE, DEPDC1 
##     JPT1, ASPM, CALM2, CENPA, PIF1, TCL1B, CCNB2, PIMREG, DLGAP5, UBE2C 
## Negative:  CDC6, KLRD1, CLSPN, GINS2, GNLY, CD7, CST7, CTSW, FEN1, DHFR 
##     MCM4, DTL, CD3E, MCM6, TK1, HELLS, CDC45, FAM111B, MCM10, KLRB1 
## PC_ 6 
## Positive:  GNLY, KLRD1, CD7, CTSW, CD3E, CST7, IFITM1, GZMA, NKG7, KLRB1 
##     CD247, GZMM, GZMB, HOPX, KLRC1, CCL5, CMC1, SH2D1B, PRF1, FCGR3A 
## Negative:  S100A12, THBS1, VCAN, S100A8, SMIM3, CD99, CD9, CD14, S100A9, PLBD1 
##     CD163, LGALS2, CLEC4E, LINC01013, MS4A6A, NCF1, MGST1, CSF3R, RPS4Y2, ARPP21 
## PC_ 7 
## Positive:  FCGR3A, MS4A7, SIGLEC10, PECAM1, SMIM25, CDKN1C, CSF1R, LILRB1, ABI3, CDH23 
##     LRRC25, HSPA1B, LILRB2, IFITM3, VMO1, WARS, PPM1N, OAS1, SELPLG, TPPP3 
## Negative:  S100A12, THBS1, S100A8, VCAN, CSF3R, RNASE2, S100A9, CD14, PLBD1, MGST1 
##     MCEMP1, CCL3, SELL, RETN, CD163, SLC25A37, ASPH, LGALS2, ASGR2, CST7 
## PC_ 8 
## Positive:  LGR5, RNF213, NR4A2, RGS16, ZNF608, CD83, ENC1, TNFAIP3, MAT2A, HSH2D 
##     CD164, CLTC, IFRD1, FCHSD2, AC008060.1, NR4A3, KCNQ1OT1, TCL1A, SH2D1A, NFKB2 
## Negative:  RPS18, RPS6, RPS2, EEF1B2, RPL35, TAGLN2, RPL7A, GAPDH, RPLP0, SERPINB1 
##     RPL12, CD99, RPSA, VIM, TXN, PPIA, S100A10, MIF, UCP2, ANXA2 
## PC_ 9 
## Positive:  DNTT, DPEP1, DEPP1, FAM213A, PRSS57, SH2D1A, IGLL1, DNAJB1, IFITM3, NUCB2 
##     SERPINE1, TMEM107, PECAM1, AKAP12, DEPTOR, SMIM3, FOSB, RASD1, POU4F1, NFKBIZ 
## Negative:  MS4A1, JCHAIN, SMC6, LSP1, RHEX, FCRLA, BANK1, IGKC, IGLL5, TAGLN2 
##     IGHG3, PLD4, PLTP, CRIP2, CORO1A, UCP2, LMNA, PPP1R14A, ANXA2, TCL1A 
## PC_ 10 
## Positive:  CRHBP, MSRB3, AVP, AJ009632.2, LINC02573, MLLT3, MYCT1, PRSS57, ATP8B4, SPINK2 
##     BEX3, ZNF385D, BEX2, CAVIN1, MIR155HG, FCER1A, AKR1C3, CAVIN2, AC246787.2, CPA3 
## Negative:  UCP2, GNLY, DBI, PPIA, CD9, NKG7, KLRD1, CD3E, CD7, CD24 
##     DNTT, CD79B, GZMA, TCL1B, ANXA2, KLRB1, S100A10, CD99, CMC1, GZMM

Mitochondrial Gene Filtering

Cells with an unusually high proportion of mitochondrial transcripts can be indicative of dying cells, where the cellular cytoplasm is lost, and most remaining transcripts are those enclosed within the mitochondria. To ensure the reliability of our analyses, we exclude cells that exhibit more than 10% of mitochondrial associated gene expression.

Criteria

  • Maximum Mitochondrial Gene Expression: Cells with mitochondrial gene expression greater than 10% are filtered out.
  • After this filter, the number of remaining cells for further analysis is 2919.

Visualization: Mitochondrial Gene Expression versus Number of Features

To provide a visual perspective on the filtering:

# Plot percentage of reads mapping to the mitochondrial genome in function of RNA features number
df <- data.frame(hash.id = Seurat@misc$old_meta_data$hash.ID, percent.mito = Seurat@misc$old_meta_data$percent.mito, nFeature_RNA = Seurat@misc$old_meta_data$nFeature_RNA)
ggplotly(ggplot(df, aes(x = nFeature_RNA, y = percent.mito, color = hash.id)) +
  geom_point() +
  geom_hline(aes(yintercept = 0.1, colour = "max %mito")))

Data Visualization

Feature and Count Distribution by Sample

The violin plot below showcases the distribution of gene counts and features across different samples.

Samples with predominantly tumoral cells (i.e., T1-CD19pos and T2-CD19neg) exhibit a higher number of expressed genes, as anticipated.

UMAP Visualization by Sample

UMAP (Uniform Manifold Approximation and Projection) provides a 2D representation of the dataset, enabling visualization of sample clustering. In Figure 1D, each point corresponds to a cell, colored based on its sample identity: T1-CD19neg, T1-CD19pos, T2-CD19neg, and T2-CD19pos.

DimPlot(Seurat, reduction = "umap", group.by = "hash.ID", label = TRUE, pt.size = 1, cols = c("#00BA38", "#B79F00", "#00BFC4", "red"), order = c("T1-CD19n", "T1-CD19p", "T2-CD19n", "T2-CD19p")) #+NoLegend()

Data Clustering and Visualization

UMAP Clusters Visualization

The UMAP plot in this displays the major cell clusters derived from the data. Six main clusters are visualized, which were determined with a resolution setting of 0.1.

Idents(Seurat) <- "RNA_snn_res.0.1"
DimPlot(Seurat, reduction = "umap", group.by = "RNA_snn_res.0.1", label = TRUE, pt.size = 1, cols = c("#00BFC4", "#B79F00", "#619CFF", "#00BA38", "orange", "#7c0073")) # ,"#F564E3","red","blue"))#+NoLegend()

Expression of Known Markers

This figure presents a dot plot, offering insights into the expression levels of well-recognized marker genes across the identified clusters.

Idents(Seurat) <- "RNA_snn_res.0.1"
Seurat@active.ident <- factor(Seurat@active.ident, levels = c("5", "2", "4", "3", "1", "0"))
dp <- DotPlot(Seurat, features = c("CD34", "RPS14", "CD79A", "CD79B", "CD19", "MME", "NKG7", "GNLY", "KLRD1", "GZMB", "KLRC1", "LYZ", "CD68", "LGALS3", "CD14", "CD33"), cols = c("blue", "red")) + RotatedAxis()
dp + labs(title = "Expression of marker genes by clusters")

Exploration of Marker Expression and Cluster-Specific Genes

UMAP Visualization of Selected Markers

The UMAP plots below display the expression patterns of the markers:

  • B-ALL markers: CD34+ and RPS14low
  • B-cell markers: CD79A+, CD79B+
FeaturePlot(object = Seurat, features = c("CD79A", "CD79B", "RPS14", "CD34"), reduction = "umap", cols = c("grey", "light blue", "cyan3", "cyan4", "dodgerblue3", "blue", "mediumslateblue", "purple", "orchid3", "red", "brown", "black"), order = TRUE, pt.size = 0.2, ncol = 2)

Differential Expression Analysis

To identify cluster-specific genes, we performed differential gene expression analysis across the identified cell clusters. The results are presented in the table below:

Idents(Seurat) <- "RNA_snn_res.0.1"
if (!file.exists(paste0(OUTPUT_PATH, "FindAllMarkers_clusters_res0.1_results_", SAMPLE, ".Robj"))) {
  Seurat_coarse_clusters_markers <- FindAllMarkers(object = Seurat, only.pos = FALSE, min.pct = 0.25, thresh.use = 0.25, do.print = FALSE)
  save(Seurat_coarse_clusters_markers, file = paste0(OUTPUT_PATH, "FindAllMarkers_clusters_res0.1_results_", SAMPLE, ".Robj"))
} else {
  load(paste0(OUTPUT_PATH, "FindAllMarkers_clusters_res0.1_results_", SAMPLE, ".Robj"))
}

datatable(Seurat_coarse_clusters_markers, options = list(pageLength = 15)) %>%
  formatRound(2, 1) %>%
  formatSignif(c(1, 5))
write.table(Seurat_coarse_clusters_markers, file = paste0(OUTPUT_PATH, "FindAllMarkers_clusters_clean-subset_results_", SAMPLE, ".csv"), sep = ",")

Expression Visualization of Key Markers Across Clusters

UMAP Expression Plots

The plots below highlight the expression of the top marker genes for each cluster, determined based on their average log2 fold change (avg_logFC).

top_genes <- Seurat_coarse_clusters_markers %>%
  group_by(cluster) %>%
  top_n(10, avg_log2FC) %>%
  top_n(20, p_val)

top_genes_feature_plot <- Seurat_coarse_clusters_markers %>%
  group_by(cluster) %>%
  top_n(2, avg_log2FC)

Expression Profile of IKZF1

The UMAP plot illustrates the expression pattern of the gene IKZF1 across all cells.

FeaturePlot(object = Seurat, features = "IKZF1", reduction = "umap", cols = c("grey", "blue", "red"), pt.size = 0.2)

avg_expression <- AverageExpression(Seurat, features = "IKZF1", group.by = "hash.ID")
print(avg_expression$RNA)
##      T2-CD19neg T1-CD19neg T2-CD19pos T1-CD19pos
## [1,]  0.8273365  0.6687816   0.818389   1.370305

Differential Expression Analysis of B-ALL Leukemic Stem Cell Markers

We aim to explore the expression patterns of key B-ALL leukemic stem cell (LSC) markers across different conditions. By understanding the differential expression of these markers between T1 and T2 conditions, we can gain insights into potential changes in the LSC population, offering clues about disease progression or treatment effects.

Visualization of LSC Markers on UMAP

First, let’s take a look at the UMAP visualization of selected LSC markers.

LSC_markers <- c("CD34", "CD38", "CD47", "CD96", "CD44", "CD93")

FeaturePlot(object = Seurat, features = LSC_markers, reduction = "umap", cols = c("grey", "blue", "red"), pt.size = 0.2, label = T)

# Using a color scale from blue (low expression) to red (high expression)
FeaturePlot(
  object = Seurat, features = LSC_markers, reduction = "umap",
  cols = c("lightblue", "red"), pt.size = 0.5, min.cutoff = "q10", max.cutoff = "q90"
)

Differential Expression Analysis Setup

We’ll subset the data to focus on the conditions of interest and then proceed with the differential expression analysis.

# Set active identity to "hash.ID" for subsetting
Idents(Seurat) <- "hash.ID"
head(Idents(Seurat))
## AAACCTGGTCTAAAGA-1 AAACGGGCACAGATTC-1 AAAGCAAAGAGTAATC-1 AAAGTAGGTCCATCCT-1 
##         T1-CD19neg         T1-CD19neg         T1-CD19neg         T1-CD19neg 
## AAATGCCGTTATTCTC-1 AACACGTCAAAGGCGT-1 
##         T1-CD19neg         T1-CD19neg 
## Levels: T2-CD19neg T1-CD19neg T2-CD19pos T1-CD19pos
# 1. Create a subset of the data containing only the conditions of interest: T1 (both CD19pos and CD19neg) and T2 (both CD19pos and CD19neg)
subset_conditions <- subset(Seurat, cells = WhichCells(Seurat, idents = c("T1-CD19neg", "T1-CD19pos", "T2-CD19neg", "T2-CD19pos")))

# 2. Set the identity for the subset to "hash.ID" for clarity
Idents(subset_conditions) <- "hash.ID"

Performing Differential Expression Analysis

Next, we’ll compare the expression levels of our selected leukemic stem cell markers between the T1 and T2 conditions.

# Compare T1-CD19pos vs T2-CD19pos
DEG_T1pos_vs_T2pos <- FindMarkers(
  object = subset_conditions,
  ident.1 = "T1-CD19pos",
  ident.2 = "T2-CD19pos",
  features = LSC_markers,
  only.pos = FALSE,
  min.pct = 0.25,
  thresh.use = 0.25,
  do.print = FALSE
)

# Compare T1-CD19neg vs T2-CD19neg
DEG_T1neg_vs_T2neg <- FindMarkers(
  object = subset_conditions,
  ident.1 = "T1-CD19neg",
  ident.2 = "T2-CD19neg",
  features = LSC_markers,
  only.pos = FALSE,
  min.pct = 0.25,
  thresh.use = 0.25,
  do.print = FALSE
)

Displaying Differential Expression Results

The tables below show the differential expression results for our selected LSC markers across the two conditions.

# 5. Display the results (for simplicity, only displaying the first comparison here)
print("Differential Expression Results for T1-CD19pos vs T2-CD19pos:")
## [1] "Differential Expression Results for T1-CD19pos vs T2-CD19pos:"
datatable(DEG_T1pos_vs_T2pos) %>%
  formatRound(2:4, 2) %>%
  formatSignif(c(1, 5), digits = 2)
# 6. Save the results to CSV files
print("Differential Expression Results for T1-CD19neg vs T2-CD19neg:")
## [1] "Differential Expression Results for T1-CD19neg vs T2-CD19neg:"
datatable(DEG_T1neg_vs_T2neg) %>%
  formatRound(2:4, 2) %>%
  formatSignif(c(1, 5), digits = 2)

Discussion:

In this scRNA-seq analysis, the authors intricately processed and analyzed the transcriptomic landscapes of B-ALL cells pre- and post-CART therapy (Zhao et al., 2023). Data visualization, including a violin plot, highlighted gene count and feature distributions (Inoue et al., 2022). Tumoral-rich samples, especially T1-CD19pos and T2-CD19neg, exhibited an extensive gene expression spectrum. UMAP was harnessed to simplify the high-dimensional data, revealing distinct cellular clusters indicative of potential B-ALL subpopulations (Zabriskie et al., 2017). The clusters were further characterized by mapping known markers (Inoue et al., 2022). The differential expression analysis pinpointed genes with notable expression shifts post-treatment (Zhao et al., 2023). Building upon this, my work delved into the question of whether post-CART therapy B-ALL cells showcased augmented leukemic stem cell marker levels.

The results revealed significant shifts in leukemic stem cell markers post-CART therapy, hinting at potential adaptive mechanisms (Seo et al., 2015). Notably, CD44 saw a pronounced upregulation, suggesting enhanced stemness or resistance. On the other hand, CD34 presented a mixed expression profile, underscoring the cellular heterogeneity in B-ALL’s response to CART therapy (Seo et al., 2015). This investigation directly addresses the initial query, affirming the dynamic molecular landscape of B-ALL cells post-therapy.

References

Session info

## R version 4.3.1 (2023-06-16)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Pop!_OS 22.04 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.10.0 
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=es_MX.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [5] LC_MONETARY=es_MX.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=es_MX.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=es_MX.UTF-8 LC_IDENTIFICATION=C       
## 
## time zone: America/Mexico_City
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] knitr_1.43         RColorBrewer_1.1-3 magrittr_2.0.3     dplyr_1.1.2       
## [5] plotly_4.10.2      ggplot2_3.4.3      DT_0.28            SeuratObject_4.1.3
## [9] Seurat_4.3.0.1    
## 
## loaded via a namespace (and not attached):
##   [1] rstudioapi_0.15.0      jsonlite_1.8.7         spatstat.utils_3.0-3  
##   [4] ggbeeswarm_0.7.2       farver_2.1.1           rmarkdown_2.24        
##   [7] vctrs_0.6.3            ROCR_1.0-11            spatstat.explore_3.2-1
##  [10] prettydoc_0.4.1        htmltools_0.5.6        sass_0.4.7            
##  [13] sctransform_0.3.5      parallelly_1.36.0      KernSmooth_2.23-22    
##  [16] bslib_0.5.1            htmlwidgets_1.6.2      ica_1.0-3             
##  [19] plyr_1.8.8             zoo_1.8-12             cachem_1.0.8          
##  [22] igraph_1.5.1           mime_0.12              lifecycle_1.0.3       
##  [25] pkgconfig_2.0.3        Matrix_1.6-1           R6_2.5.1              
##  [28] fastmap_1.1.1          fitdistrplus_1.1-11    future_1.33.0         
##  [31] shiny_1.7.5            digest_0.6.33          colorspace_2.1-0      
##  [34] patchwork_1.1.3        tensor_1.5             irlba_2.3.5.1         
##  [37] crosstalk_1.2.0        labeling_0.4.2         progressr_0.14.0      
##  [40] fansi_1.0.4            spatstat.sparse_3.0-2  httr_1.4.6            
##  [43] polyclip_1.10-4        abind_1.4-5            compiler_4.3.1        
##  [46] withr_2.5.0            highr_0.10             R.utils_2.12.2        
##  [49] MASS_7.3-60            tools_4.3.1            vipor_0.4.5           
##  [52] lmtest_0.9-40          beeswarm_0.4.0         httpuv_1.6.11         
##  [55] future.apply_1.11.0    goftest_1.2-3          R.oo_1.25.0           
##  [58] glue_1.6.2             nlme_3.1-163           promises_1.2.1        
##  [61] grid_4.3.1             Rtsne_0.16             cluster_2.1.4         
##  [64] reshape2_1.4.4         generics_0.1.3         gtable_0.3.3          
##  [67] spatstat.data_3.0-1    R.methodsS3_1.8.2      tidyr_1.3.0           
##  [70] data.table_1.14.8      sp_2.0-0               utf8_1.2.3            
##  [73] spatstat.geom_3.2-4    RcppAnnoy_0.0.21       ggrepel_0.9.3         
##  [76] RANN_2.6.1             pillar_1.9.0           stringr_1.5.0         
##  [79] limma_3.56.2           later_1.3.1            splines_4.3.1         
##  [82] lattice_0.21-8         survival_3.5-7         deldir_1.0-9          
##  [85] tidyselect_1.2.0       miniUI_0.1.1.1         pbapply_1.7-2         
##  [88] gridExtra_2.3          scattermore_1.2        xfun_0.40             
##  [91] matrixStats_1.0.0      stringi_1.7.12         lazyeval_0.2.2        
##  [94] yaml_2.3.7             evaluate_0.21          codetools_0.2-19      
##  [97] tibble_3.2.1           cli_3.6.1              uwot_0.1.16           
## [100] xtable_1.8-4           reticulate_1.31        munsell_0.5.0         
## [103] jquerylib_0.1.4        Rcpp_1.0.11            globals_0.16.2        
## [106] spatstat.random_3.1-5  png_0.1-8              ggrastr_1.0.2         
## [109] parallel_4.3.1         ellipsis_0.3.2         listenv_0.9.0         
## [112] viridisLite_0.4.2      scales_1.2.1           ggridges_0.5.4        
## [115] leiden_0.4.3           purrr_1.0.2            rlang_1.1.1           
## [118] cowplot_1.1.1